物件導向告訴我們,把資料和流程封裝起來,可以避免牽一髮而動全身,讓程式容易修改,並且可以藉由繼承和多型,在保持良好封裝的同時避免重複撰寫程式碼。然而在物件導向的基礎下,再怎麼封裝、壓縮、抽象化,終究還是會需要插入一小段程式碼來呼叫被壓縮的流程 (下圖左邊,紅色)。
當多個本來不相干的流程(上圖右邊,黃綠藍),在特定切入點中都會重複插入跟主要流程無關但又必要的流程時(上圖右邊,紅),物件導向就非常難以保持關注點分離原則,因為我們想關注的主要流程(黃綠藍)跟必要但繁瑣可以忽略的重複流程(紅)混雜在一起了。遇到這種情況純粹的 OOP 可能有些無能為力,但使用切面導向程式設計 (Aspect-Oriented Programming) 就能很有效的解決這類問題。
關注點分離(Separation of concerns,SoC),是將計算機程序分隔為不同部份的設計原則。每一部份會有各自的關注焦點。
有AOP的輔助,我們就可以把重複但可忽略的流程從主要流程中給抽離,讓主要的流程看起來沒有插入任何相關的程式碼(上圖左邊),但是實際執行時卻會執行被抽離的流程(上圖右邊)。那 ... 要怎麼達成以上如同魔法一般的目標呢? 實際上操作 AOP 之類的工具通常會有以下幾個步驟
最後補充,在不同的語言或不同的工具中,或許會有區分不同的實作方法,例如 Run-time AOP 或是 Compile-time AOP,然而無論是哪一種 AOP 背後其實都是相同的精神「把重複但跟主要邏輯無關的流程抽出並隱藏」,類似的手段 FP 也非常擅長,預計明天介紹~